//
// Created by HhL on 2020/12/24.
//

#ifndef HHL_THREADPOOL_C_THREAD_TASK_POOL_H
#define HHL_THREADPOOL_C_THREAD_TASK_POOL_H


#include <jni.h>
#include <pthread.h>

typedef struct task_pool_t {
    /* 互斥锁，用于在多线程环境下操作本结构体保证同步性 */
    pthread_mutex_t lock;
    /**
     * 条件变量，用于
     *   1、线程池中工作线程执行完任务基于这个条件变量堵塞
     *   2、向任务池中正价任务后基于这个变量唤醒所有的工作线程？？
     */
    pthread_cond_t cond_empty;
    /*
     * 用于存放任务类字节码的循环队列
     */
    jclass *task_cqueue;
    /* 任务池能存储的最大任务数 */
    jint queue_max_size;
    /* 任务池中的当前任务数 */
    jint queue_size;
    /* 当前执行到的任务index */
    jint queue_current;

} task_pool, *ptask_pool;


typedef struct thread_pool_t {
    /* 互斥锁，用于在多线程环境下操作本结构体保证同步性 */
    pthread_mutex_t lock;
    /* 所有工作线程的ID的集合 */
    pthread_t *worker_tids;

    /* 线程池的最小线程数 */
    jint thr_min_size;

    /* 线程池的最大线程数 */
    jint thr_max_size;

    /* 线程池的存活线程数 */
    jint thr_live_size;

    /* 线程池的繁忙线程数 */
    jint thr_busy_size;
} thread_pool, *pthread_pool;

/* 声明线程池 */
pthread_pool g_pthread_pool;

/* 声明任务池 */
ptask_pool g_ptask_pool;

/**=====================================
 * 线程池相关操作函数
 ======================================*/
jint thread_pool_init(JNIEnv *jEnv, jint minSize, jint maxSize);

void thread_pool_destroy();

void thread_pool_free();

void thread_pool_print(const char *msg);

/**=====================================
 * 任务池相关操作函数
 ======================================*/
void *task_run(JNIEnv *jEnv, jclass taskClass);

jint task_pool_init(JNIEnv *jEnv, jint maxSize);

jint task_pool_add(JNIEnv *jEnv, jstring taskClassName);

void task_pool_free();

void task_pool_print(const char *msg);

#endif //HHL_THREADPOOL_C_THREAD_TASK_POOL_H
